home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 2010 April / PCWorld0410.iso / pluginy Firefox / 5817 / 5817.xpi / chrome / content / createManager.js < prev    next >
Text File  |  2010-02-11  |  19KB  |  588 lines

  1. Components.utils.import("resource://sqlitemanager/sqlite.js");
  2.  
  3. var CreateManager = {
  4.   //arrays with information for each field
  5.   aFieldNames: null,
  6.   aFieldTypes: null,
  7.  
  8.   sCurrentTable: null,
  9.   sObject: null,
  10.   sOperation: null,
  11.  
  12.   numOfEmptyColumns: 20, //shown during create table
  13.  
  14.   loadEmptyColumns: function() {
  15.     var node = $$("rows-all");
  16.     this.numOfEmptyColumns = sm_prefsBranch.getIntPref("maxColumnsInTable");
  17.  
  18.     var row = $$("row-template");
  19.     for(var i = 0; i < this.numOfEmptyColumns; i++) {
  20.       var clone = row.cloneNode(true);
  21.       clone.setAttribute("id", "row-" + i);
  22.       clone.setAttribute("style", "");
  23.       var children = clone.childNodes;
  24.       var id;
  25.       for (var j = 0; j < children.length; j++) {
  26.         id = children[j].getAttribute("id") + "-" + i;
  27.         children[j].setAttribute("id", id);
  28.       };
  29.  
  30.       node.appendChild(clone);
  31.     }
  32.   },
  33.  
  34.   loadOccupiedColumns: function(sTableName) {
  35.     var bReadOnlyColNames = false;
  36.     var aRetVals = window.arguments[1];
  37.     if (typeof aRetVals.readonlyFlags != "undefined") {
  38.       if (aRetVals.readonlyFlags.indexOf("colnames") >= 0)
  39.         bReadOnlyColNames = true;
  40.     }
  41.  
  42.     $$("tablename").value = aRetVals.tableName;
  43.     var node = $$("rows-all");
  44.     this.numOfEmptyColumns = aRetVals.colNames.length;
  45.  
  46.     var row = $$("row-template");
  47.     for(var i = 0; i < this.numOfEmptyColumns; i++) {
  48.       var clone = row.cloneNode(true);
  49.       clone.setAttribute("id", "row-" + i);
  50.       clone.setAttribute("style", "");
  51.       var children = clone.childNodes;
  52.       var id;
  53.        for (var j = 0; j < children.length; j++) {
  54.            id = children[j].getAttribute("id");
  55.            if (id == "colname") {
  56.             children[j].setAttribute("value", aRetVals.colNames[i]);
  57.             if (bReadOnlyColNames)
  58.               children[j].setAttribute("readonly", bReadOnlyColNames);
  59.           }
  60.            children[j].setAttribute("id", id + "-" + i);
  61.        };
  62.  
  63.       node.appendChild(clone);
  64.     }
  65.   },
  66.     
  67.   loadCreateTableDialog: function () {
  68.     Database = window.arguments[0];
  69.     var aRetVals = window.arguments[1];
  70.  
  71.     this.sObject = "TABLE";
  72.     
  73.     this.loadDbNames("dbName", Database.logicalDbName);
  74.  
  75.     if (typeof aRetVals.tableName == "undefined")
  76.       this.loadEmptyColumns();
  77.     else
  78.       this.loadOccupiedColumns();
  79.     window.sizeToContent();
  80.   },
  81.     
  82.   changeDataType: function(sId) {
  83.     var sVal = $$(sId).value;
  84.     var sNum = sId.substr(sId.lastIndexOf("-")+1);
  85.     var sPkeyId = "primarykey-" + sNum;
  86.     var sAutoId = "autoincrement-" + sNum;
  87.  
  88.     if (sVal.toUpperCase() == "INTEGER" && $$(sPkeyId).checked)
  89.       $$(sAutoId).disabled = false;
  90.     else {
  91.       $$(sAutoId).disabled = true;
  92.       $$(sAutoId).checked = false;
  93.     }
  94.   },
  95.  
  96.   togglePrimaryKey: function(sId) {
  97.     var bPk = $$(sId).checked;
  98.     var sNum = sId.substr(sId.lastIndexOf("-")+1);
  99.     var sNullId = "allownull-" + sNum;
  100.     var sDefId = "defaultvalue-" + sNum;
  101.     var sAutoId = "autoincrement-" + sNum;
  102.     var sTypeId = "datatype-" + sNum;
  103.     if ($$(sTypeId).value.toUpperCase() == "INTEGER" && bPk)
  104.       $$(sAutoId).disabled = false;
  105.     else {
  106.       $$(sAutoId).disabled = true;
  107.       $$(sAutoId).checked = false;
  108.     }
  109.  
  110.     if (bPk) {
  111.       $$(sNullId).checked = !bPk;
  112.     }
  113.   },
  114.  
  115.   selectDb: function(sID) {
  116.     this.loadTableNames("tabletoindex", this.sCurrentTable, false);
  117.   },
  118.  
  119.   selectTable: function(sID) {
  120.     var sTable = $$(sID).value;
  121.     //function names have been assigned in the main load functions
  122.     if(this.sObject == "INDEX")
  123.       this.loadFieldNames(sTable);
  124.   },
  125.  
  126.   loadCreateIndexDialog: function () {
  127.     Database = window.arguments[0];
  128.     this.sCurrentTable = window.arguments[1];
  129.  
  130.     this.sObject = "INDEX";
  131.  
  132.     this.loadDbNames("dbName", Database.logicalDbName);
  133.     this.loadTableNames("tabletoindex", this.sCurrentTable, false);
  134.  
  135.     this.loadFieldNames(this.sCurrentTable);
  136.   },
  137.  
  138.   loadFieldNames: function(sTableName) {
  139.     document.title = sm_getLFStr("createMngr.index.title", [sTableName], 1);
  140.      var dbName = $$("dbName").value;
  141.     var cols = Database.getTableInfo(sTableName, dbName);
  142.     this.aFieldNames = [], aTypes = [];
  143.     for(var i = 0; i < cols.length; i++) {
  144.       this.aFieldNames.push(cols[i].name);
  145.       aTypes.push(cols[i].type);
  146.     }
  147.     var vbox = $$("definecolumns");
  148.  
  149.     while (vbox.firstChild) {
  150.        vbox.removeChild(vbox.firstChild);
  151.     }
  152.       
  153.     for(var i = 0; i < this.aFieldNames.length; i++) {
  154.       var radgr = document.createElement("radiogroup");
  155.       radgr.setAttribute("id", "rad-" + (i+1));
  156.  
  157.       var hbox = document.createElement("hbox");
  158.       hbox.setAttribute("flex", "1");
  159.       hbox.setAttribute("style", "margin:2px 3px 2px 3px");
  160.       hbox.setAttribute("align", "right");
  161.       
  162.       var lbl = document.createElement("label");
  163.       lbl.setAttribute("value", (i+1) + ". " + this.aFieldNames[i]);
  164.       lbl.setAttribute("style", "padding-top:5px;width:100px;");
  165.       lbl.setAttribute("accesskey", (i+1));
  166.       lbl.setAttribute("control", "rad-" + (i+1));
  167.       hbox.appendChild(lbl);
  168.       
  169.       var radio;
  170.       radio = document.createElement("radio");
  171.       radio.setAttribute("label", sm_getLStr("createMngr.index.donotuse"));
  172.       radio.setAttribute("selected", "true");
  173.       radio.setAttribute("value", "");
  174.       hbox.appendChild(radio);
  175.  
  176.       radio = document.createElement("radio");
  177.       radio.setAttribute("label", sm_getLStr("createMngr.index.ascending"));
  178.       radio.setAttribute("value", SQLiteFn.quoteIdentifier(this.aFieldNames[i]) + " ASC");
  179.       hbox.appendChild(radio);
  180.  
  181.       radio = document.createElement("radio");
  182.       radio.setAttribute("label", sm_getLStr("createMngr.index.descending"));
  183.       radio.setAttribute("value", SQLiteFn.quoteIdentifier(this.aFieldNames[i]) + " DESC");
  184.       hbox.appendChild(radio);
  185.  
  186.       radgr.appendChild(hbox);
  187.       
  188.       vbox.appendChild(radgr);
  189.     }
  190.   },
  191.  
  192.   doOKCreateIndex: function() {
  193.     var name = $$("indexname").value;
  194.     if(name == "") {
  195.       alert(sm_getLStr("createMngr.index.cannotBeNull"));
  196.       return false;
  197.     }
  198.  
  199.     var dbName = $$("dbName").value;
  200.      name = Database.getPrefixedName(name, dbName);
  201.  
  202.     var tbl = $$("tabletoindex").value;
  203.     var dup = $$("duplicatevalues").selectedItem.value;
  204.     
  205.     var radgr, radval;
  206.     var cols = "";
  207.     for(var i = 0; i < this.aFieldNames.length; i++) {
  208.       radgr = $$("rad-" + (i+1));
  209.       radval = radgr.value;
  210.       if(radval != "") {
  211.         if(cols != "")
  212.           radval = ", " + radval;
  213.         
  214.         cols = cols + radval;
  215.       }
  216.     }  
  217.     if(cols == "") {
  218.       alert(sm_getLStr("createMngr.index.noFieldsSelected"));
  219.       return false;
  220.     }
  221.     
  222.     var sQuery = "CREATE " + dup + " INDEX " + name + " ON " + SQLiteFn.quoteIdentifier(tbl) +  " (" + cols + ")";
  223.     return Database.confirmAndExecute([sQuery], sm_getLFStr("createMngr.index.confirm", [name], 1), "confirm.create");
  224.   },
  225.  
  226.   loadCreateTriggerDialog: function () {
  227.     Database = window.arguments[0];
  228.     this.sCurrentTable = window.arguments[1];
  229.  
  230.     this.sObject = "trigger";
  231.  
  232.     this.loadDbNames("dbName", Database.logicalDbName);
  233.     this.loadTableNames("tabletoindex", this.sCurrentTable, false);
  234.   },
  235.  
  236.   //used for create index/trigger dialogs;
  237.   loadTableNames: function(sListBoxId, sTableName, bMaster) {
  238.     var dbName = $$("dbName").value;
  239.     var listbox = $$(sListBoxId);
  240.  
  241.     var aMastTableNames = [];
  242.     if (bMaster)
  243.       aMastTableNames = Database.getObjectList("master", dbName);
  244.     var aNormTableNames = Database.getObjectList("table", dbName);
  245.     var aObjectNames = aMastTableNames.concat(aNormTableNames);
  246.     PopulateDropDownItems(aObjectNames, listbox, sTableName);
  247.  
  248.     if(this.sObject == "INDEX")
  249.       this.selectTable("tabletoindex");
  250.   },
  251.  
  252.   loadDbNames: function(sListBoxId, sDbName) {
  253.     var listbox = $$(sListBoxId);
  254.     var aObjectNames = Database.getDatabaseList();
  255.     PopulateDropDownItems(aObjectNames, listbox, sDbName);
  256.   },
  257.  
  258.   doOK: function() {
  259.   },
  260.     
  261.   modifyTable: function(sOperation, sTable, sColumn) {
  262.     //get the columns
  263.     var cols = Database.getTableInfo(sTable, "");
  264.     if (sOperation == "alterColumn") {
  265.       //correct the cols array
  266.       for(var i = 0; i < cols.length; i++) {
  267.         if (cols[i].name == sColumn.oldColName) {
  268.           cols[i].name = sColumn.newColName;
  269.           cols[i].type = sColumn.newColType;
  270.           cols[i].dflt_value = sColumn.newDefaultValue;
  271.         }
  272.         else
  273.           continue;
  274.       }
  275.     }
  276.     if (sOperation == "dropColumn") {
  277.       //correct the cols array
  278.       for(var i = 0; i < cols.length; i++) {
  279.         if (cols[i].name == sColumn) {
  280.           cols.splice(i, 1);
  281.         }
  282.         else
  283.           continue;
  284.       }
  285.     }
  286.  
  287.     var aPK = [], aCols = [], aColNames = [];
  288.  
  289.     for(var i = 0; i < cols.length; i++) {
  290.       var colname = cols[i].name;
  291.       colname = SQLiteFn.quoteIdentifier(colname);
  292.       aColNames.push(colname);
  293.  
  294.       var col = [i, colname];
  295.       aCols.push(col);
  296.       if(cols[i].pk == 1)
  297.         aPK.push(colname);
  298.     }
  299.     var colList = aColNames.toString();
  300.  
  301.     var aColDefs = [];
  302.     for(var i = 0; i < aCols.length; i++) {
  303.       var j = aCols[i][0]
  304.       var datatype = cols[j].type;
  305.  
  306.       var txtNull = " NOT NULL ";
  307.       if(cols[j].notnull == 0)
  308.         txtNull = "";
  309.  
  310.       var defaultvalue = "";
  311.       if(cols[j].dflt_value != null)
  312.         defaultvalue = " DEFAULT " + cols[j].dflt_value + " ";
  313.  
  314.       var pk = "";
  315.       if(aPK.length == 1 && aPK[0] == aCols[i][1])
  316.         pk = " PRIMARY KEY ";
  317.       var col = aCols[i][1] + " " + datatype + pk + txtNull + defaultvalue;
  318.       aColDefs.push(col);
  319.     }
  320.     var coldef = aColDefs.toString();
  321.  
  322.     //this is the primary key constraint on multiple columns
  323.     var constraintPK = "";
  324.     if(aPK.length > 1)
  325.       constraintPK = ", PRIMARY KEY (" + aPK.toString() + ") ";
  326.  
  327.     coldef += constraintPK;
  328.  
  329. ////////////////////////////
  330.     var sTab = Database.getPrefixedName(sTable, "");
  331.     var sTempTable = Database.getPrefixedName(SmGlobals.tempNamePrefix + sTable, "");
  332.     var sTempTableName = SQLiteFn.quoteIdentifier(SmGlobals.tempNamePrefix + sTable);
  333.     
  334.     var aQueries = [];
  335.     aQueries.push("ALTER TABLE " + sTab + " RENAME TO "  + sTempTableName);
  336.     aQueries.push("CREATE TABLE " + sTab + " (" + coldef + ")");    
  337.     if (sOperation == "dropColumn")
  338.       aQueries.push("INSERT INTO " + sTab + " SELECT " + colList + " FROM " + sTempTable);
  339.     if (sOperation == "alterColumn")
  340.       aQueries.push("INSERT INTO " + sTab + " SELECT * FROM " + sTempTable);    
  341.     aQueries.push("DROP TABLE " + sTempTable);    
  342.  
  343.     var sMsg = "";
  344.     if (sOperation == "dropColumn")
  345.       sMsg = sm_getLFStr("createMngr.dropColumn", [sColumn, sTab], 2);
  346.     if (sOperation == "alterColumn")
  347.       sMsg = sm_getLFStr("createMngr.alterColumn", [sColumn[0], sTab], 2);
  348.  
  349.     var bReturn = Database.confirmAndExecute(aQueries, sMsg, "confirm.otherSql");
  350.     return bReturn;
  351.   },
  352.  
  353.   doOKCreateTable: function() {
  354.     var name = $$("tablename").value;
  355.     if(name == "") {
  356.       alert(sm_getLStr("createMngr.tbl.cannotBeNull"));
  357.       return false;
  358.     }
  359.     if(name.indexOf("sqlite_") == 0) {
  360.       alert(sm_getLStr("createMngr.tbl.cannotBeginSqlite"));
  361.       return false;
  362.     }
  363.  
  364.     var txtTemp = "";
  365.     if($$("temptable").checked)
  366.       txtTemp = " TEMP ";
  367.  
  368.     //temp object will be created in temp db only
  369.     if (txtTemp == "") {
  370.       var dbName = $$("dbName").value;
  371.        name = Database.getPrefixedName(name, dbName);
  372.      }
  373.      else
  374.        name = SQLiteFn.quoteIdentifier(name);
  375.  
  376.     var txtExist = "";
  377.     if($$("ifnotexists").checked)
  378.       txtExist = " IF NOT EXISTS ";
  379.  
  380.     //find which textboxes contain valid entry for column name
  381.     var iTotalRows = this.numOfEmptyColumns;
  382.     var aCols = [];
  383.     for(var i = 0; i < iTotalRows; i++) {
  384.       var colname = $$("colname-" + i).value;
  385.       if(colname.length == 0 || colname == null || colname == undefined) {
  386.         continue;
  387.       }
  388.       if(colname == "rowid" || colname == "_rowid_" || colname == "oid") {
  389.         alert(sm_getLStr("createMngr.invalidColname"));
  390.         return false;
  391.       }
  392.       //if colname is valid, get the col definition details in aCols array; coldef needs name, datatype, pk, autoinc, default, allownull
  393.       var col = [];
  394.       colname = SQLiteFn.quoteIdentifier(colname);
  395.       col["name"] = colname;
  396.       col["type"] = $$("datatype-" + i).value;
  397.       col["check"] = "";
  398.       var si = $$("datatype-" + i).selectedItem;
  399.       if (si != null) {
  400.         if (si.hasAttribute('sm_check')) {
  401.           col["type"] = si.getAttribute('sm_type');
  402.           col["check"] = si.getAttribute('sm_check');
  403.           col["check"] = col["check"].replace("zzzz", colname, "g");
  404.         }
  405.       }
  406.       col["pk"] = $$("primarykey-" + i).checked;
  407.       col["autoinc"] = $$("autoincrement-" + i).checked;
  408.       col["defValue"] = $$("defaultvalue-" + i).value;
  409.       col["allowNull"] = $$("allownull-" + i).checked;
  410.       aCols.push(col);
  411.     }
  412.  
  413.     //populate arrays for primary key and count autoincrement columns
  414.     var aPK = [], iAutoIncCols = 0;
  415.     for(var i = 0; i < aCols.length; i++) {
  416.       if(aCols[i]["pk"]) {
  417.         aPK.push(aCols[i]["name"]);
  418.       }
  419.       if(aCols[i]["autoinc"]) {
  420.         iAutoIncCols++;
  421.       }
  422.     }
  423.     //some checks follow
  424.     if(iAutoIncCols > 1) {
  425.       alert(sm_getLStr("createMngr.autoincError.cols"));
  426.       return false; //do not leave the dialog
  427.     }
  428.     if(iAutoIncCols > 0 && aPK.length > 1) {
  429.       alert(sm_getLStr("createMngr.autoincError.PK"));
  430.       return false; //do not leave the dialog
  431.     }
  432.     
  433.     //prepare an array of column definitions
  434.     var aColDefs = [];
  435.     for(var i = 0; i < aCols.length; i++) {
  436.       var sColDef = aCols[i]["name"] + " " + aCols[i]["type"];
  437.  
  438.       if(aPK.length == 1 && aCols[i]["pk"])
  439.         sColDef += " PRIMARY KEY ";
  440.       if(aCols[i]["autoinc"])
  441.         sColDef += " AUTOINCREMENT ";
  442.  
  443.       if(!aCols[i]["allowNull"])
  444.         sColDef += " NOT NULL ";
  445.         
  446.       if(aCols[i]["check"] != "")
  447.         sColDef += " " + aCols[i]["check"] + " ";
  448.         
  449.       var sDefValue = SQLiteFn.makeDefaultValue(aCols[i]["defValue"]);
  450.       if (sDefValue != null)
  451.         sColDef += " DEFAULT " + sDefValue;
  452.  
  453.       aColDefs.push(sColDef);
  454.     }
  455.  
  456.     //this is the primary key constraint on multiple columns
  457.     if(aPK.length > 1) {
  458.       var constraintPK = "PRIMARY KEY (" + aPK.join(", ") + ")";
  459.       aColDefs.push(constraintPK);
  460.     }
  461.  
  462.     var sQuery = "CREATE " + txtTemp + " TABLE " + txtExist + name + " (" + aColDefs.join(", ") + ")";
  463.  
  464.     var aRetVals = window.arguments[1];
  465.     aRetVals.tableName = name;
  466.     aRetVals.createQuery = sQuery;
  467.     aRetVals.ok = true;
  468.     return true;
  469.   },
  470.  
  471.   loadCreateViewDialog: function () {
  472.     Database = window.arguments[0];
  473.     var aRetVals = window.arguments[1];
  474.     this.loadDbNames("dbName", aRetVals.dbName);
  475.     if (typeof aRetVals.readonlyFlags != "undefined") {
  476.       if (aRetVals.readonlyFlags.indexOf("dbnames") >= 0)
  477.         $$("dbName").setAttribute("disabled", true);
  478.       if (aRetVals.readonlyFlags.indexOf("viewname") >= 0)
  479.         $$("objectName").setAttribute("readonly", true);
  480.     }
  481.     if (typeof aRetVals.modify != "undefined") {
  482.       $$("objectName").value = aRetVals.objectName;
  483.       $$("txtSelectStatement").value = aRetVals.selectStmt;
  484.       $$("tempObject").disabled = true;
  485.       $$("ifnotexists").disabled = true;
  486.  
  487.       $$("txtSelectStatement").focus();
  488.       document.title = sm_getLStr("createMngr.modifyView");
  489.     }
  490.   },
  491.   
  492.   doOKCreateView: function() {
  493.     var name = $$("objectName").value;
  494.     if(name == "") {
  495.       alert(sm_getLStr("createMngr.view.cannotBeNull"));
  496.       return false;
  497.     }
  498.  
  499.     var txtTemp = "";
  500.     if($$("tempObject").checked)
  501.       txtTemp = " TEMP ";
  502.       
  503.     //temp object will be created in temp db only
  504.     if (txtTemp == "") {
  505.       var dbName = $$("dbName").value;
  506.        name = Database.getPrefixedName(name, dbName);
  507.      }
  508.      else
  509.        name = SQLiteFn.quoteIdentifier(name);
  510.  
  511.     var txtExist = "";
  512.     if($$("ifnotexists").checked)
  513.       txtExist = " IF NOT EXISTS ";
  514.         
  515.     var selectStatement = $$("txtSelectStatement").value;
  516.     if(selectStatement == "") {
  517.       alert(sm_getLStr("createMngr.statement.cannotBeNull"));
  518.       return false;
  519.     }
  520.  
  521.     var aRetVals = window.arguments[1];
  522.     var aQueries = [];
  523.     if (typeof aRetVals.modify != "undefined") {
  524.       aQueries.push("DROP VIEW " + name);
  525.     }
  526.     var sQuery = "CREATE " + txtTemp + " VIEW " + txtExist + name 
  527.           + " AS " + selectStatement;
  528.     aQueries.push(sQuery);
  529.  
  530.     aRetVals.objectName = name;
  531.     aRetVals.queries = aQueries;
  532.     aRetVals.ok = true;
  533.     return true;
  534.   },
  535.  
  536.   doOKCreateTrigger: function() {
  537.     var name = $$("objectName").value;
  538.     if(name == "") {
  539.       alert(sm_getLStr("createMngr.trigger.cannotBeNull"));
  540.       return false;
  541.     }
  542.  
  543.     var txtTemp = "";
  544.     if($$("tempObject").checked)
  545.       txtTemp = " TEMP ";
  546.  
  547.     //temp object will be created in temp db only
  548.     if (txtTemp == "") {
  549.       var dbName = $$("dbName").value;
  550.        name = Database.getPrefixedName(name, dbName);
  551.      }
  552.      else
  553.        name = SQLiteFn.quoteIdentifier(name);
  554.  
  555.     var txtExist = "";
  556.     if($$("ifnotexists").checked)
  557.       txtExist = " IF NOT EXISTS ";
  558.         
  559.     var txtForEachRow = "";
  560.     if($$("foreachrow").checked)
  561.       txtForEachRow = " FOR EACH ROW ";
  562.         
  563.     var whenExpression = $$("txtWhenExpression").value;
  564.     if(whenExpression == "" || whenExpression == null) {
  565.       whenExpression = "";
  566.     }
  567.     else
  568.       whenExpression = " WHEN " + whenExpression + " ";
  569.  
  570.     var steps = $$("txtTriggerSteps").value;
  571.     if(steps == "") {
  572.       alert(sm_getLStr("createMngr.trigger.cannotBeEmpty"));
  573.       return false;
  574.     }
  575.  
  576.     var txtTable = $$("tabletoindex").value;
  577.     var txtTime = $$("triggerTime").selectedItem.label;
  578.     var txtEvent = $$("dbEvent").selectedItem.label;
  579.  
  580.     var sQuery = "CREATE " + txtTemp + " TRIGGER " + txtExist + name + " " + txtTime + " " + txtEvent + " ON " + txtTable + txtForEachRow + whenExpression + " BEGIN " + steps + " END";
  581.     return Database.confirmAndExecute([sQuery], sm_getLFStr("createMngr.trigger.confirm", [name], 1), "confirm.create");
  582.   },
  583.  
  584.   doCancel: function() {
  585.     return true;
  586.   }
  587. };
  588.